
// 每根筷子对应一个信号量，每个信号量的初始值为 1
// 每个信号量可以控制哲学家互斥访问对应的筷子
semaphore chopstick[5];
void init() {
    for (int i = 0; i < 5; i++) 
        chopstick[i] = 1;
}

// 哲学家 i 的活动过程
void philosopher(int i) {

    while (true) {
        thinking();  // 思考

        if (i % 2 == 1) {
            wait(chopstick[i]); // 先拿左边的筷子
            wait(chopstick[(i + 1) % 5]); // 再拿右边的筷子
        } else {
            wait(chopstick[(i + 1) % 5]); // 先拿右边的筷子
            wait(chopstick[i]); // 再拿左边的筷子
        }

        eating();   // 就餐

        // 释放筷子（顺序无关）
        signal(chopstick[i]); // 释放左边的筷子
        signal(chopstick[(i + 1) % 5]); // 释放右边的筷子
    }

}

